[アップデート]Step FunctionsでSageMakerの前処理ができるようになりました

[アップデート]Step FunctionsでSageMakerの前処理ができるようになりました

Clock Icon2020.08.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、もきゅりんです。

AWS Step Functions adds support for Amazon SageMaker Processing

これまでも Step Functions と SageMaker を利用して学習と推論を行う、ハイパーパラメータのチューニングを行って推論を行うこと、ができたようですが、前処理もワークフロー内で実行可能になりました。

機械学習における一連のタスクフローを Step Functions を通して実行できるようになった、わーい! ということですね。

本日 (2020/08/05) から東京リージョン (ap-northeast-1) でも使用できます。

sample project をやってみる

コンソールから Step Functions -> State machines -> Create state machine から

新しく追加されたであろうプロジェクトを選択。

とりあえず次へ。

画像の通り、

CloudFormation でステートマシン、ラムダ、S3バケット、(関連するIAMロールも)作るよーと聞かれます。

いいよーとデプロイします。

上記リソースを作成するのに10分程度かかります。

と書かれていますが、3分程度で完了しました。

構築が完了すると、New execution ページが立ち上がるので、 execution name に適当な名前を付けて実行します。 (特に設定しなくても実行に支障はないです)

完了するまでにステートマシンの中身を大雑把に見ていくと

Generate dataset でデモデータおよび前処理コードを作成して、S3バケットにアップします。

{
  "StartAt": "Generate dataset",
  "States": {
    "Generate dataset": {
      "Resource": "arn:aws:lambda:sa-east-1:1234567890:function:FeatureTransform-LambaForDataGeneration-17M8LX7IO9LUW",
      "Type": "Task",
      "Next": "Standardization: x' = (x - x̄) / σ"
    },

Standardization で、今回のアップデートのミソとなる前処理APIを指定して各種パラメータにて対象のデータ、実行環境、前処理のためのコードなどを設定します。

その処理されたデータを使って、モデルを学習させます。

    "Standardization: x' = (x - x̄) / σ": {
      "Resource": "arn:aws:states:::sagemaker:createProcessingJob.sync",
      "Parameters": {
        "ProcessingResources": {
          "ClusterConfig": {
            "InstanceCount": 1,
            "InstanceType": "ml.m5.xlarge",
            "VolumeSizeInGB": 10
          }
        },
        "ProcessingInputs": [
            {
                "InputName": "input-1",
                "S3Input": {
                    "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/input/raw.csv",
                    "LocalPath": "/opt/ml/processing/input",
                    "S3DataType": "S3Prefix",
                    "S3InputMode": "File",
                    "S3DataDistributionType": "FullyReplicated",
                    "S3CompressionType": "None"
                }
            },
            {
                "InputName": "code",
                "S3Input": {
                    "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/code/transform.py",
                    "LocalPath": "/opt/ml/processing/input/code",
                    "S3DataType": "S3Prefix",
                    "S3InputMode": "File",
                    "S3DataDistributionType": "FullyReplicated",
                    "S3CompressionType": "None"
                }
            }
        ],
        "ProcessingOutputConfig": {
            "Outputs": [
                {
                    "OutputName": "train_data",
                    "S3Output": {
                        "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/train",
                        "LocalPath": "/opt/ml/processing/output/train",
                        "S3UploadMode": "EndOfJob"
                    }
                }
            ]
        },
        "AppSpecification": {
            "ImageUri": "737474898029.dkr.ecr.sa-east-1.amazonaws.com/sagemaker-scikit-learn:0.20.0-cpu-py3",
            "ContainerEntrypoint": [
                "python3",
                "/opt/ml/processing/input/code/transform.py"
            ]
        },
        "StoppingCondition": {
            "MaxRuntimeInSeconds": 300
        },
        "RoleArn": "arn:aws:iam::1234567890:role/SageMakerAPIExecutionRole-AIDACKCEVSQ6C2EXAMPLE",
        "ProcessingJobName.$": "$$.Execution.Name"
      },
      "Type": "Task",
      "Next": "Train model (XGBoost)"
    },

Train model(XGBoost) にて学習APIを指定して、前処理されたデータ、実行環境、ハイパーパラメータなどを指定してモデルを学習させてS3バケットに格納します。

    "Train model (XGBoost)": {
      "Resource": "arn:aws:states:::sagemaker:createTrainingJob.sync",
      "Parameters": {
        "AlgorithmSpecification": {
          "TrainingImage": "855470959533.dkr.ecr.sa-east-1.amazonaws.com/xgboost:latest",
          "TrainingInputMode": "File"
        },
        "OutputDataConfig": {
          "S3OutputPath": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/models"
        },
        "StoppingCondition": {
          "MaxRuntimeInSeconds": 86400
        },
        "ResourceConfig": {
          "InstanceCount": 1,
          "InstanceType": "ml.m5.xlarge",
          "VolumeSizeInGB": 30
        },
        "RoleArn": "arn:aws:iam::1234567890:role/SageMakerAPIExecutionRole-AIDACKCEVSQ6C2EXAMPLE",
        "InputDataConfig": [
          {
            "DataSource": {
              "S3DataSource": {
                "S3DataDistributionType": "ShardedByS3Key",
                "S3DataType": "S3Prefix",
                "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz"
              }
            },
            "ChannelName": "train",
            "ContentType": "text/csv"
          }
        ],
        "HyperParameters": {
          "objective": "reg:logistic",
          "eval_metric": "rmse",
          "num_round": "5"
        },
        "TrainingJobName.$": "$$.Execution.Name"
      },
      "Type": "Task",
      "End": true
    }
  }
}

完了しました。

ステートマシンのイベント履歴から SageMaker のトレーニングジョブに飛べます。

そこから学習済みのモデルがS3にアップロードされているのが確認できました。

なお、参考までに下記ブログでは Step Functions Data Science SDK を使って、前処理を含めた、より汎用的な機械学習のワークフロー例を取り上げています。

Building machine learning workflows with Amazon SageMaker Processing jobs and AWS Step Functions

Step Functions どんどん便利になっていきますね。

何か恩恵を賜りたい今日この頃です。

以上です。

どなたかのお役に立てば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.